package com.qf.smsplatform.gateway.netty4;

import com.qf.smsplatform.common.model.StandardSubmit;
import com.qf.smsplatform.gateway.mq.MTQueue;
import com.qf.smsplatform.gateway.mq.StatQueue;
import com.qf.smsplatform.gateway.netty4.Utils.MsgUtils;
import com.qf.smsplatform.gateway.netty4.entity.CmppDeliver;
import com.qf.smsplatform.gateway.netty4.entity.CmppSubmitResp;
import com.qf.smsplatform.gateway.netty4.entity.ControlWindow;
import com.qf.smsplatform.gateway.netty4.entity.ReportMatch;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


/**
 * 主要业务 handler
 * @author weixiang
 * @date 2018/8/2 15:37
 */

public class CMPPHandler extends SimpleChannelInboundHandler {
    private final static Logger log = LoggerFactory.getLogger(CMPPHandler.class);

    @Override
    protected void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception {

        // 就是运营商的第一次回调 --- 短信正在发送中.....
        if (msg instanceof CmppSubmitResp){
            CmppSubmitResp resp=(CmppSubmitResp)msg;   // 获取到了运营商的响应,拿到msg并向下转型
            log.info("-------------接收到短信提交应答-------------");
            log.info("----自增id："+resp.getMsgId());   //sequenceId?
            log.info("----状态："+ resp.getState());
            log.info("----第一次响应："+resp.getMsgId2());
            ControlWindow controlWindow = ControlWindow.getInstance();   // 声明controlWindow,临时存储submit对象的位置
            StandardSubmit submit = (StandardSubmit)controlWindow.remove(resp.getMsgId());   // 根据controlWindow获取到了之前存储的submit对象
            log.info("从滑动窗体中取 msgid:{},submit:{}",resp.getMsgId(),submit);
            ReportMatch reportMatch = ReportMatch.getInstance();          // 声明reportMatch对象,临时存储submit对象的位置
            log.info("把 msgid:{},submit:{}，放入reportMatch",resp.getMsgId(),submit);
            reportMatch.put(resp.getMsgId2(),submit);                      // 将submit对象存储到了reportMatch中

            MTQueue mtQueue = MTQueue.getInstance();                    // 声明MT的队列
            submit.setMsgid(String.valueOf(resp.getMsgId2()));          // 将submit中的msgId封装
            //未返回状态
            submit.setReportState(1);                                   // 设置了submit中短信发送的状态 , 1代表短信正在发送
            mtQueue.add(submit);                                        // 将submit对象添加到了MT队列中
            //1. 在第一次回调中,将submit中的msgid和reportState属性封装好
            //2. 将submit从controlWindows中移除,并临时保存到了reportMatch里.
            //3. 将submit对象添加到了MTQueue的队列中
        }


        // 就是运营商的第二次回调  --- 短信发送成功/失败
        if (msg instanceof CmppDeliver){
            CmppDeliver resp=(CmppDeliver)msg;          // 获取到msg对象,并强转为CmppDeliver
            // 是否为状态报告 0：非状态报告1：状态报告
            if (resp.getRegistered_Delivery() == 1) {           // 如果是状态报告响应,需要发送两个消息到MQ
                // 如果是状态报告的话
                log.info("-------------状态报告---------------");
                log.info("----第二次响应："+resp.getMsg_Id_DELIVRD());
                log.info("----手机号："+resp.getDest_terminal_Id());
                log.info("----状态："+resp.getStat());
                StatQueue statQueue = StatQueue.getInstance();  // 声明了一个队列
                statQueue.add(msg);                             // 将返回的状态信息CmppDeliver,交给了statQueue
            } else {
                //用户回复会打印在这里
                log.info(""+ MsgUtils.bytesToLong(resp.getMsg_Id()));
                log.info(resp.getSrc_terminal_Id());
                log.info(resp.getMsg_Content());
            }
        }
    }

}
